package com.yunke.common.result;

import lombok.Data;

import java.io.Serializable;

/**
 * 云科统一返回结果类
 * 
 * @param <T> 数据类型
 * @author yunke
 * @since 1.0.0
 */
@Data
public class YunkeResult<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 响应状态码
     */
    private Integer code;

    /**
     * 响应消息
     */
    private String message;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 时间戳
     */
    private Long timestamp;

    /**
     * 私有构造方法
     */
    private YunkeResult() {
        this.timestamp = System.currentTimeMillis();
    }

    /**
     * 私有构造方法
     */
    private YunkeResult(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
        this.timestamp = System.currentTimeMillis();
    }

    /**
     * 成功返回
     */
    public static <T> YunkeResult<T> success() {
        return new YunkeResult<>(YunkeResultCode.SUCCESS.getCode(), YunkeResultCode.SUCCESS.getMessage(), null);
    }

    /**
     * 成功返回带数据
     */
    public static <T> YunkeResult<T> success(T data) {
        return new YunkeResult<>(YunkeResultCode.SUCCESS.getCode(), YunkeResultCode.SUCCESS.getMessage(), data);
    }

    /**
     * 成功返回自定义消息
     */
    public static <T> YunkeResult<T> success(String message) {
        return new YunkeResult<>(YunkeResultCode.SUCCESS.getCode(), message, null);
    }

    /**
     * 成功返回自定义消息和数据
     */
    public static <T> YunkeResult<T> success(String message, T data) {
        return new YunkeResult<>(YunkeResultCode.SUCCESS.getCode(), message, data);
    }

    /**
     * 成功返回数据和自定义消息（参数顺序不同）
     */
    public static <T> YunkeResult<T> success(T data, String message) {
        return new YunkeResult<>(YunkeResultCode.SUCCESS.getCode(), message, data);
    }



    /**
     * 失败返回
     */
    public static <T> YunkeResult<T> error() {
        return new YunkeResult<>(YunkeResultCode.ERROR.getCode(), YunkeResultCode.ERROR.getMessage(), null);
    }

    /**
     * 失败返回自定义消息
     */
    public static <T> YunkeResult<T> error(String message) {
        return new YunkeResult<>(YunkeResultCode.ERROR.getCode(), message, null);
    }

    /**
     * 失败返回自定义状态码和消息
     */
    public static <T> YunkeResult<T> error(Integer code, String message) {
        return new YunkeResult<>(code, message, null);
    }

    /**
     * 基于结果码枚举返回
     */
    public static <T> YunkeResult<T> result(YunkeResultCode resultCode) {
        return new YunkeResult<>(resultCode.getCode(), resultCode.getMessage(), null);
    }

    /**
     * 基于结果码枚举返回带数据
     */
    public static <T> YunkeResult<T> result(YunkeResultCode resultCode, T data) {
        return new YunkeResult<>(resultCode.getCode(), resultCode.getMessage(), data);
    }

    /**
     * 自定义返回
     */
    public static <T> YunkeResult<T> result(Integer code, String message, T data) {
        return new YunkeResult<>(code, message, data);
    }

    /**
     * 判断是否成功
     */
    public boolean isSuccess() {
        return YunkeResultCode.SUCCESS.getCode().equals(this.code);
    }

    /**
     * 判断是否失败
     */
    public boolean isError() {
        return !isSuccess();
    }
} 